#include "extension.h"
#include "enum_ext.h"
#include "union_ext.h"
#include "builtin_ext.h"
#include <stdio.h>

int main() {
    // --------------------------
    // 1. 测试枚举(enum)扩展
    // --------------------------
    printf("===== 测试枚举(enum)扩展 =====\n");
    Color color = YELLOW;
    EXTEND(Color, &color, print);  // 打印颜色
    // 和以下代码效果一样
    Color_print(&color);
    printf("是否为暖色: %s\n", EXTEND(Color, &color, is_warm) ? "是" : "否");

    color = BLUE;
    printf("颜色名称: %s\n", EXTEND(Color, &color, to_string));
    printf("是否为暖色: %s\n\n", EXTEND(Color, &color, is_warm) ? "是" : "否");

    // --------------------------
    // 2. 测试联合体(union)扩展
    // --------------------------
    printf("===== 测试联合体(union)扩展 =====\n");
    TaggedVariant var;

    // 测试int类型
    TaggedVariant_init(&var, TYPE_INT);
    EXTEND(TaggedVariant, &var, set_value, 100);
    EXTEND(TaggedVariant, &var, print);

    // 测试float类型
    TaggedVariant_init(&var, TYPE_FLOAT);
    EXTEND(TaggedVariant, &var, set_value, 3.14f);
    EXTEND(TaggedVariant, &var, print);

    // 测试bool类型
    TaggedVariant_init(&var, TYPE_BOOL);
    EXTEND(TaggedVariant, &var, set_value, true);
    EXTEND(TaggedVariant, &var, print);

    // 测试char类型
    TaggedVariant_init(&var, TYPE_CHAR);
    EXTEND(TaggedVariant, &var, set_value, 'A');
    EXTEND(TaggedVariant, &var, print);
    printf("\n");

    // --------------------------
    // 3. 测试内置类型(int)扩展
    // --------------------------
    printf("===== 测试内置类型(int)扩展 =====\n");
    int num = 15;
    EXTEND(int, &num, print);
    printf("加5的结果: %d\n", EXTEND(int, &num, add, 5));
    printf("是否为偶数: %s\n\n", EXTEND(int, &num, is_even) ? "是" : "否");

    // --------------------------
    // 4. 测试内置类型(float)扩展
    // --------------------------
    printf("===== 测试内置类型(float)扩展 =====\n");
    float f = -3.5f;
    EXTEND(float, &f, print);
    printf("乘2的结果: %.2f\n", EXTEND(float, &f, multiply, 2));
    printf("是否为正数: %s\n", EXTEND(float, &f, is_positive) ? "是" : "否");

    return 0;
}
